#ifndef MAIN_LOGIN_H
#define MAIN_LOGIN_H

#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
#include "lv_drivers/display/fbdev.h"
#include "lv_drivers/indev/evdev.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <stdlib.h> // 提供 rand() 和 srand()
#include <sys/time.h>
#include <stdio.h>
#include "kernel_list.h"
#include <string.h>
#include "2048.h"

#define DISP_BUF_SIZE (128 * 1024)
LV_FONT_DECLARE(SourceHanSansCN_Bold_20); // 声明字体是外部定义的
LV_FONT_DECLARE(lv_font_montserrat_20);   // 声明字体是外部定义的
LV_FONT_DECLARE(lv_font_montserrat_30);   // 声明字体是外部定义的
LV_FONT_DECLARE(lv_font_montserrat_48);   // 声明字体是外部定义的

lv_timer_t * timer;  //使用 LVGL 定时器更新时间
lv_obj_t * label_hint;

// 屏幕结构体
typedef struct interface
{
    lv_obj_t * screen;
    char name[20];
    list_head_t list;
} face_t, *face_p;

// 用户账号密码结构体
typedef struct log_in
{
    face_p head;
    char name[20];
    char psw[20];
    list_head_t list;
} damin_t, *damin_p;

typedef struct
{
    damin_p admain;
    lv_obj_t * username_ta;
    lv_obj_t * password_ta;
    char username[20];
    char psw[20];
    lv_obj_t * btn_in;
    lv_obj_t * btn_re;
    lv_obj_t * label_warn;
    int je;
} login_t, *login_p;

// 提示系统结构
typedef struct {
    lv_obj_t * label;
    lv_coord_t original_x;
    lv_coord_t original_y;
} hint_system_t;

static lv_obj_t * kb;

extern face_p find(face_p head, char name[20]);              // 查找界面函数
extern face_p faceinsertend(face_p head, char name[20]);     // 界面添加到链表
extern char * time_get();                                    // 获取当前时间
extern int insertend_reg(damin_p head_in, login_p data_log); // 添加账号
extern int contrast_reg(damin_p head_in,login_p data);// 对比账号密码(都正确返回1，否则返回0,无账号返回-1)


extern void log_in(face_p head, login_p data_log);// 登录界面


// 事件函数
extern void ta_event_cb(lv_event_t * e);           // 文本框&键盘事件
extern void update_time_label(lv_timer_t * timer); // 定时器回调函数
extern void in_but_cb(lv_event_t * e);             // 登录按钮回调函数
extern void reg_but_cb(lv_event_t * e);            // 注册按钮回调函数
extern void retuen_but_cb(lv_event_t * e);         // 返回按钮事件




// -------------------------------------------滑动处理------------------------------------------------------

// 滑动方向枚举定义
typedef enum {
    SLIDE_NONE = 0,    // 0: 无滑动
    SLIDE_LEFT,        // 1: 向左滑动
    SLIDE_RIGHT,       // 2: 向右滑动
    SLIDE_UP,          // 3: 向上滑动
    SLIDE_DOWN         // 4: 向下滑动
} slide_direction_t;

/**
 * @brief 滑动函数
 * @param temp 当前屏幕结构体
 */
extern void slide(lv_obj_t * cont);
slide_direction_t get_slide_direction(void);


#endif